package com.lyeducation.entities.system;

import com.lyeducation.entities.base.BaseTreeEntity;
import org.springframework.security.core.GrantedAuthority;

import javax.persistence.*;
import java.util.Comparator;
import java.util.Objects;
import java.util.TreeSet;

@Entity
@Table(name = "sys_role", schema = "db_wsfpro", catalog = "")
public class SysRoleEntity extends BaseTreeEntity<SysRoleEntity> implements GrantedAuthority {
  //  private HashSet<SysRoleEntity> childRoles;
  private TreeSet<SysMenuEntity> menus;
  //  权限级别以0开始为最大级别
  private int level;
  /** 非数据库字段 */
  private Boolean isCheck;

  //  SysRoleEntity(){
  ////    初始
  //    level=-1;
  //  }
//  @Transient
//  public HashSet<SysRoleEntity> getChildRoles() {
//    return childRoles;
//  }
//
//  public void setChildRoles(HashSet<SysRoleEntity> childRoles) {
//    this.childRoles = childRoles;
//  }

  @Transient
  public TreeSet<SysMenuEntity> getMenus() {
    return menus;
  }

  /** @param menus */
  public void setMenus(TreeSet<SysMenuEntity> menus) {
    if (menus == null) {
      menus =
          new TreeSet<SysMenuEntity>(
              new Comparator<SysMenuEntity>() {
                @Override
                public int compare(SysMenuEntity o1, SysMenuEntity o2) {
                  if (o1.getId().equals(o2.getId())) {
                    return 0;
                  }
                  int sort = o1.getSort() - o2.getSort();
                  if (sort == 0) {
                    return 1;
                  }
                  return o1.getSort() - o2.getSort();
                }
              });
    }
    this.menus = menus;
  }

  @Transient
  public Boolean getIsCheck() {
    return isCheck;
  }

  public void setIsCheck(Boolean check) {
    this.isCheck = check;
  }

  @Basic
  @Column(name = "level", nullable = false, length = 4)
  public int getLevel() {
    return level;
  }

  public void setLevel(int level) {
    this.level = level;
  }

  @Override
  public boolean equals(Object o) {
    if (this == o) {
      return true;
    }
    if (!(o instanceof SysRoleEntity)) {
      return false;
    }
    if (!super.equals(o)) {
      return false;
    }
    SysRoleEntity that = (SysRoleEntity) o;
    return this.getId().equals(that.getId());
  }



  @Transient
  @Override
  public String getAuthority() {
    return this.getName();
  }

//  public static void setChildRoles(SysRoleEntity roleEntity,Collection<SysRoleEntity> sysRoleEntityList) {
//    Iterator<SysRoleEntity> iterator = sysRoleEntityList.iterator();
//    while (iterator.hasNext()) {
//      SysRoleEntity sysRoleEntity = iterator.next();
//      if (roleEntity.getId().equals(sysRoleEntity.getParentId())) {
//        if (roleEntity.getChildRoles() == null) {
//          roleEntity.setChildRoles(new HashSet<SysRoleEntity>());
//        }
//        roleEntity.getChildRoles().add(sysRoleEntity);
//        iterator.remove();
//      }
//    }
//    if(roleEntity.getChildRoles()==null){
//      return;
//    }
//    for(SysRoleEntity sysRoleEntity: roleEntity.getChildRoles()){
//      setChildRoles(sysRoleEntity,sysRoleEntityList);
//    }
//  }
//
//  public static HashSet<SysRoleEntity> setChildRolesByCollection(List<SysRoleEntity> sysRoleEntityList) {
//    if (sysRoleEntityList != null && sysRoleEntityList.size() > 1) {
//      HashSet<SysRoleEntity> vertexMenuSet = new HashSet<SysRoleEntity>();
//      //      还是要考虑多个顶级菜单
//      //      菜单集合剩余都是顶点菜单集则排序结束
//
//      while (!vertexMenuSet.containsAll(sysRoleEntityList)) {
//        SysRoleEntity menuEntity = null;
//        for (int i = 0; i < sysRoleEntityList.size(); i++) {
//          menuEntity = sysRoleEntityList.get(i);
//          if (!vertexMenuSet.contains(menuEntity)) {
//            break;
//          }
//        }
//
//        //        SysMenuEntity levelMenu = allReadySortMenuSet.first();
//        //        if (levelMenu == null) {
//        //          allReadySortMenuSet.add(menuEntity);
//        //        } else {
//        //          if (menuEntity.getLevel() < levelMenu.getLevel()) {
//        //            allReadySortMenuSet.clear();
//        //            allReadySortMenuSet.add(menuEntity);
//        //          } else if (menuEntity.getLevel() == levelMenu.getLevel()) {
//        //            allReadySortMenuSet.add(menuEntity);
//        //          }
//        //        }
//
//        //        顶点菜单赋予其所有下级菜单并从菜单集合去除其所有下级菜单
//        setChildRoles(menuEntity, sysRoleEntityList);
//        //     首选顶点菜单可能会存在上级需要重新加回来
//        sysRoleEntityList.add(menuEntity);
//        //        每个作为顶点菜单都有可能包含之前所有作为顶点菜单的顶点
//        //        检验顶点菜单集合是否有被作其上级顶点菜单包含了
//        Iterator<SysRoleEntity> vertexMenuIterator = vertexMenuSet.iterator();
//        while (vertexMenuIterator.hasNext()) {
//          SysRoleEntity vertexMenu = vertexMenuIterator.next();
//          //          如果剩余菜单已经不存在顶点菜单则已经有其上级顶点菜单包含了需要移除其作为顶点菜单资格
//          if (!sysRoleEntityList.contains(vertexMenu)) {
//            vertexMenuIterator.remove();
//          }
//        }
//        //        存已作为新顶点菜单
//        vertexMenuSet.add(menuEntity);
//      }
//      //      setParentMenu(menuEntity, sysMenuEntityList);
//      TreeSet<SysRoleEntity> realVertexMenuSet =
//              new TreeSet<SysRoleEntity>(
//                      new Comparator<SysRoleEntity>() {
//                        @Override
//                        public int compare(SysRoleEntity o1, SysRoleEntity o2) {
//                          if (o2.getId().equals(o1.getId())) {
//                            return 0;
//                          }
//                          return 1;
//                        }
//                      });
//      realVertexMenuSet.addAll(vertexMenuSet);
//      return vertexMenuSet;
//    }
//    return null;
//  }


  @Override
  public int hashCode() {

    return Objects.hash(super.hashCode(), menus, level, isCheck);
  }
}
